#include "friend.pb.h"
#include "mprpcapplication.h"


#include <iostream>

int main(int argc, char **argv)
{
    // 整个程序启动以后，想使用 mprpc 框架来享受 rpc 服务调用，一定要先调用框架的初始化函数（只初始化一次）
    MprpcApplication::Init(argc, argv);

    // 演示调用远程发布的 rpc 方法 Login
    fixbug::FriendServiceRpc_Stub stub(new MprpcChannel());
    
    // rpc 方法的请求参数
    fixbug::GetFriendListRequest requeset;
    requeset.set_userid(14);

    // rpc 方法的响应
    fixbug::GetFriendListResponse response;

    // 发起 rpc 方法的调用，同步的 rpc 调用过程 底层就是MprpcChannel::CallMethod方法的调用
    MprpcController controller;
    stub.GetFriendList(&controller, &requeset, &response, nullptr);  // RpcChannel->RpcChannel::CallMethod 集中来做所有 rpc 方法调用的参数序列化和网络发送

    // 一次 rpc 调用完成，读调用的结果，直接通过响应的错误代码判定是否调用成功，是理想结果 -> 通过controller记录的信息，判断是否发生错误
    if(controller.Failed())
    {
        std::cout << controller.ErrorText() << std::endl;
    }
    else  // 返回false是没有错误
    {
        if (response.result().errcode() == 0)  // 这个数据格式是约定的
        {
            std::cout << "rpc GetFriendList response success: " << std::endl;
            int size = response.friends_size();
            for (int i = 0; i < size; ++i)
            {
                std::cout << "index:" << i + 1 << " --- name:" << response.friends(i) << std::endl;
            }
        }
        else
        {
            std::cout << "rpc GetFriendList response error: " << response.result().errmsg() << std::endl;
        }
    }


    return 0;
}